/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package erp.financeiro.dao;

import erp.financeiro.Modulos;
import erp.financeiro.StatusTransacao;
import erp.financeiro.TipoTransacao;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import erp.financeiro.Transacao;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 *
 * @author Robert
 */
public class TransacaoDAO {


    public static Transacao buscarTransacaoId(Long id) throws Exception {

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("erpfinanceiroPU");
        EntityManager em = emf.createEntityManager();

        return em.find(Transacao.class, id);
    }

     public static Transacao cadastrar(String idDadosBancarios, TipoTransacao tipo, Boolean patrimonio, String descricao,String datavencimento,Double valor,Double valormulta, Modulos modulo) throws Exception {
         Transacao transacao = new Transacao();
         transacao.setDadosBancarios(DadosBancariosDAO.getDadosBancariosById(Long.parseLong(idDadosBancarios)));
         transacao.setDescricao(descricao);
         transacao.setTipo(tipo);
         transacao.setPatrimonio(patrimonio);
         SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
         Date vencimento = new Date(format.parse(datavencimento).getTime());
         transacao.setVencimento(vencimento);
         transacao.setCriacao(new Date(System.currentTimeMillis()));
         transacao.setModulo(modulo);
         transacao.setValor(valor);
         transacao.setMulta(valormulta);
         transacao.setUsuario(UsuarioDAO.getUsuariosById(new Long(1)));
         transacao.setStatus(StatusTransacao.PENDENTE);

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("erpfinanceiroPU");
        EntityManager em = emf.createEntityManager();

        em.getTransaction().begin();
        em.persist(transacao);
        em.getTransaction().commit();

        return transacao;
     }

     public static Transacao editar(Long id, String idDadosBancarios, TipoTransacao tipo, String descricao, Boolean patrimonio, String datavencimento,Double valor,Double valormulta) throws Exception{
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("erpfinanceiroPU");
        EntityManager em = emf.createEntityManager();

        Transacao transacao = TransacaoDAO.buscarTransacaoId(id);

        transacao.setDadosBancarios(DadosBancariosDAO.getDadosBancariosById(Long.parseLong(idDadosBancarios)));
         transacao.setDescricao(descricao);
         transacao.setTipo(tipo);
         transacao.setPatrimonio(patrimonio);
         SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
         Date vencimento = new Date(format.parse(datavencimento).getTime());
         transacao.setVencimento(vencimento);
         transacao.setCriacao(new Date(System.currentTimeMillis()));
         transacao.setModulo(Modulos.FINANCEIRO);
         transacao.setValor(valor);
         transacao.setMulta(valormulta);
         transacao.setUsuario(UsuarioDAO.getUsuariosById(new Long(1)));
         transacao.setStatus(StatusTransacao.PENDENTE);

        em.getTransaction().begin();
        em.merge(transacao);
        em.getTransaction().commit();

        return transacao;
     }

     public static Boolean excluir(Long id){
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("erpfinanceiroPU");
        EntityManager em = emf.createEntityManager();

        Transacao transacao = em.find(Transacao.class, id);

        try{
            em.getTransaction().begin();
            em.remove(transacao);
            em.getTransaction().commit();
        } catch (Exception e){
            return Boolean.FALSE;
        }

        return Boolean.TRUE;
     }

     public static Transacao alterarStatus(Long id, StatusTransacao status){
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("erpfinanceiroPU");
        EntityManager em = emf.createEntityManager();

        Transacao transacao = em.find(Transacao.class, id);

        // Se estiver em uma operação de finalizar a transação, seta a data de Pagamento
        // Atualiza a tabela de saldo, criando um novo valor
        if((!transacao.getStatus().equals(StatusTransacao.FINALIZADO)) && (status.equals(StatusTransacao.FINALIZADO))){
            transacao.setPagamento(new Date());
            SaldoDAO.criarSaldo(transacao);
        }

        transacao.setStatus(status);

        em.getTransaction().begin();
        em.merge(transacao);
        em.getTransaction().commit();

        return transacao;
     }
}
